Projeto Final

Introdução

Projeto Final: Análise de Dados da Olist Store (2016 a 2018)

Este projeto tem como foco a análise dos dados da Olist Store, uma plataforma de e-commerce que conecta pequenos e médios lojistas a diversos marketplaces. O objetivo é compreender o comportamento do mercado, identificar padrões de venda e avaliar a eficiência das operações da plataforma no período de 2016 a 2018. A análise será útil para lojistas que utilizam a plataforma, consumidores e profissionais de e-commerce e logística, oferecendo insights baseados em dados que podem otimizar estratégias de vendas e aprimorar a experiência do cliente.

Os dados utilizados foram disponibilizados pelo Kaggle e contêm informações detalhadas sobre pedidos, produtos, vendedores e avaliações de clientes. A análise será realizada com o uso de R, juntamente com pacotes como ggplot2 e plotly, para explorar os dados, identificar padrões e investigar correlações. Entre as métricas analisadas estão o desempenho das categorias de produtos e a satisfação do cliente, com foco em tendências temporais e geográficas.

Com uma abordagem quantitativa, esta análise buscará identificar tendências de vendas e padrões sazonais, além de avaliar o impacto de fatores externos, como localização dos vendedores, sobre os resultados. Esses insights podem ser utilizados por lojistas para otimizar seus estoques, estratégias de marketing e atendimento ao cliente, além de fornecer uma visão clara sobre quais categorias de produtos são mais lucrativas.

A Olist é uma plataforma que facilita a integração de pequenos e médios lojistas a marketplaces, oferecendo suporte logístico e de atendimento. Isso permite que os vendedores ampliem seu alcance e se concentrem no crescimento dos negócios. Para mais informações sobre os dados utilizados nesta análise, acesse:Kaggle - Brazilian E-Commerce Dataset.

Pacotes utilizados

library(knitr)        # Para renderizar documentos em RMarkdown.
library(dplyr)        # Manipulação e transformação de dados.
library(ggplot2)      # Visualização de dados.
library(plotly)       # Gráficos interativos a partir dos objetos ggplot2.
library(scales)       # Formatação e escala de eixos e rótulos em gráficos.
library(lubridate)    # Manipulação de datas e horários.
library(rnaturalearth) # Dados geoespaciais de países e continentes.
library(kableExtra)   # Melhorar a apresentação de tabelas geradas com knitr::kable().
library(tidytext)     # Análise de texto e manipulação de textos.
library(tidyr)        # Para limpeza e organização de dados.
library(gridExtra)    # Para combinar gráficos em um único layout.
library(stringr)      # Manipulação de strings.

Preparação dos Dados

Neste projeto, utilizaremos um conjunto de dados que contém 9 tabelas. Para facilitar a análise, vamos utilizar algumas dessas tabelas e dividir o processo em duas partes, agrupando as mais relevantes em cada etapa. Abaixo, apresentamos uma visão geral do schema das tabelas, destacando as conexões entre elas:

Tabelas Utilizadas na Primeira Análise

Itens do Pedido

# Carregar os dados dos itens do pedido
order_items_df <- read.csv("datasets/olist_order_items_dataset.csv")
# Mostrar as primeiras linhas do dataset de itens do pedido
kable(head(order_items_df))
order_id order_item_id product_id seller_id shipping_limit_date price freight_value
00010242fe8c5a6d1ba2dd792cb16214 1 4244733e06e7ecb4970a6e2683c13e61 48436dade18ac8b2bce089ec2a041202 2017-09-19 09:45:35 58.90 13.29
00018f77f2f0320c557190d7a144bdd3 1 e5f2d52b802189ee658865ca93d83a8f dd7ddc04e1b6c2c614352b383efe2d36 2017-05-03 11:05:13 239.90 19.93
000229ec398224ef6ca0657da4fc703e 1 c777355d18b72b67abbeef9df44fd0fd 5b51032eddd242adc84c38acab88f23d 2018-01-18 14:48:30 199.00 17.87
00024acbcdf0a6daa1e931b038114c75 1 7634da152a4610f1595efa32f14722fc 9d7a1d34a5052409006425275ba1c2b4 2018-08-15 10:10:18 12.99 12.79
00042b26cf59d7ce69dfabb4e55b4fd9 1 ac6c3623068f30de03045865e4e10089 df560393f3a51e74553ab94004ba5c87 2017-02-13 13:57:51 199.90 18.14
00048cc3ae777c65dbb7d2a0634bc1ea 1 ef92defde845ab8450f9d70c526ef70f 6426d21aca402a131fc0a5d0960a3c90 2017-05-23 03:55:27 21.90 12.69

Metadados do pedido

Número total de linhas: 112.650

Nome_do_Campo Tipo_de_Dado Descrição
order_id character ID do pedido
order_item_id integer ID do item do pedido
product_id character ID do produto
seller_id character ID do vendedor
shipping_limit_date character Data limite de envio
price numeric Preço
freight_value numeric Valor do frete

Produtos

# Carregar os dados dos produtos
products_df <- read.csv("datasets/olist_products_dataset.csv")

# Mostrar as primeiras linhas do dataset de produtos
kable(head(products_df))
product_id product_category_name product_name_lenght product_description_lenght product_photos_qty product_weight_g product_length_cm product_height_cm product_width_cm
1e9e8ef04dbcff4541ed26657ea517e5 perfumaria 40 287 1 225 16 10 14
3aa071139cb16b67ca9e5dea641aaa2f artes 44 276 1 1000 30 18 20
96bd76ec8810374ed1b65e291975717f esporte_lazer 46 250 1 154 18 9 15
cef67bcfe19066a932b7673e239eb23d bebes 27 261 1 371 26 4 26
9dc1a7de274444849c219cff195d0b71 utilidades_domesticas 37 402 4 625 20 17 13
41d3672d4792049fa1779bb35283ed13 instrumentos_musicais 60 745 1 200 38 5 11

Metadados do produto

Número total de linhas: 32.951

Nome_do_Campo Tipo_de_Dado Descrição
product_id character ID do produto
product_category_name character Nome da categoria do produto
product_name_length integer Comprimento do nome do produto
product_description_length integer Comprimento da descrição do produto
product_photos_qty integer Quantidade de fotos do produto
product_weight_g integer Peso do produto (em gramas)
product_length_cm integer Comprimento do produto (em cm)
product_height_cm integer Altura do produto (em cm)
product_width_cm integer Largura do produto (em cm)

Vendedores

# Carregar os dados dos vendedores
sellers_df <- read.csv("datasets/olist_sellers_dataset.csv")

# Mostrar as primeiras linhas do dataset de vendedores
kable(head(sellers_df))
seller_id seller_zip_code_prefix seller_city seller_state
3442f8959a84dea7ee197c632cb2df15 13023 campinas SP
d1b65fc7debc3361ea86b5f14c68d2e2 13844 mogi guacu SP
ce3ad9de960102d0677a81f5d0bb7b2d 20031 rio de janeiro RJ
c0f3eea2e14555b6faeea3dd58c1b1c3 4195 sao paulo SP
51a04a8a6bdcb23deccc82b0b80742cf 12914 braganca paulista SP
c240c4061717ac1806ae6ee72be3533b 20920 rio de janeiro RJ

Metadados do vendedores

Número total de linhas: 3.095

Nome_do_Campo Tipo_de_Dado Descrição
seller_id character ID do vendedor
seller_zip_code_prefix integer Prefixo do CEP do vendedor
seller_city character Cidade do vendedor
seller_state character Estado do vendedor

Mesclando as Tabelas

# Mesclar o dataset de itens do pedido com o dataset de produtos para adicionar a categoria de cada produto
merged_df <- merge(order_items_df,
                   products_df[, c("product_id", "product_category_name")],
                   by = "product_id",
                   all.x = TRUE)

# Mesclar o dataset resultante com o dataset de vendedores para adicionar o estado de cada vendedor
final_df <- merge(merged_df,
                  sellers_df[, c("seller_id", "seller_state")],
                  by = "seller_id",
                  all.x = TRUE)

# Mostrar as primeiras linhas do dataset mesclado
kable(head(final_df))
seller_id product_id order_id order_item_id shipping_limit_date price freight_value product_category_name seller_state
0015a82c2db000af6aaaf3ae2ecb0532 a2ff5a97bf95719e38ea2e3b4105bce8 d455a8cb295653b55abda06d434ab492 1 2017-10-12 22:24:16 895 21.02 eletroportateis SP
0015a82c2db000af6aaaf3ae2ecb0532 a2ff5a97bf95719e38ea2e3b4105bce8 9dc8d1a6f16f1b89874c29c9d8d30447 1 2017-10-18 14:49:22 895 21.02 eletroportateis SP
0015a82c2db000af6aaaf3ae2ecb0532 a2ff5a97bf95719e38ea2e3b4105bce8 7f39ba4c9052be115350065d07583cac 1 2017-10-24 23:56:20 895 21.02 eletroportateis SP
001cca7ae9ae17fb1caed9dfb1094831 08574b074924071f4e201e151b152b4e dea9b7dcae5affc919947e72bcc1e786 2 2017-08-22 03:26:10 99 37.99 ferramentas_jardim ES
001cca7ae9ae17fb1caed9dfb1094831 08574b074924071f4e201e151b152b4e d63f6af53a35a1d7e6a58ec09548b9ed 1 2017-06-29 02:25:12 89 37.92 ferramentas_jardim ES
001cca7ae9ae17fb1caed9dfb1094831 08574b074924071f4e201e151b152b4e e957b106ffd9736003e8249630634a04 1 2017-10-09 16:07:16 99 73.54 ferramentas_jardim ES

Selecionando Colunas Relevantes

# Selecionar apenas as colunas relevantes: nome da categoria, preço, data limite de envio, e estado do vendedor
final_df <- final_df %>%
  select(product_category_name, price, shipping_limit_date, seller_state)

# Mostrar as primeiras linhas do dataset filtrado
kable(head(final_df))
product_category_name price shipping_limit_date seller_state
eletroportateis 895 2017-10-12 22:24:16 SP
eletroportateis 895 2017-10-18 14:49:22 SP
eletroportateis 895 2017-10-24 23:56:20 SP
ferramentas_jardim 99 2017-08-22 03:26:10 ES
ferramentas_jardim 89 2017-06-29 02:25:12 ES
ferramentas_jardim 99 2017-10-09 16:07:16 ES

Limpando os Dados

# Remover registros que não possuem categoria de produto
final_df <- final_df[which(final_df$product_category_name != ""), ]

# Converter a coluna 'shipping_limit_date' para o formato de data
final_df$shipping_limit_date <- as.Date(final_df$shipping_limit_date)

# Mostrar as primeiras linhas do dataset final, limpo e pronto para análise
kable(head(final_df))
product_category_name price shipping_limit_date seller_state
eletroportateis 895 2017-10-12 SP
eletroportateis 895 2017-10-18 SP
eletroportateis 895 2017-10-24 SP
ferramentas_jardim 99 2017-08-22 ES
ferramentas_jardim 89 2017-06-29 ES
ferramentas_jardim 99 2017-10-09 ES

Metadados da tabela final

Número total de linhas: 111.047

Nome_do_Campo Tipo_de_Dado Descrição
product_category_name character Nome da categoria do produto
price Numeric Preço
shipping_limit_date Date Data limite de envio
seller_state character Estado do vendedor

Tabelas para segunda parte da analise

Reviews

# Carregar os dados dos reviews
olist_order_reviews <- read.csv("datasets/olist_order_reviews_dataset.csv")
# Mostrar as primeiras linhas do dataset de reviews
kable(head(olist_order_reviews))
review_id order_id review_score review_comment_title review_comment_message review_creation_date review_answer_timestamp
7bc2406110b926393aa56f80a40eba40 73fc7af87114b39712e6da79b0a377eb 4 2018-01-18 00:00:00 2018-01-18 21:46:59
80e641a11e56f04c1ad469d5645fdfde a548910a1c6147796b98fdf73dbeba33 5 2018-03-10 00:00:00 2018-03-11 03:05:13
228ce5500dc1d8e020d8d1322874b6f0 f9e4b658b201a9f2ecdecbb34bed034b 5 2018-02-17 00:00:00 2018-02-18 14:36:24
e64fb393e7b32834bb789ff8bb30750e 658677c97b385a9be170737859d3511b 5 Recebi bem antes do prazo estipulado. 2017-04-21 00:00:00 2017-04-21 22:02:06
f7c4243c7fe1938f181bec41a392bdeb 8e6bfb81e283fa7e4f11123a3fb894f1 5 Parabéns lojas lannister adorei comprar pela Internet seguro e prático Parabéns a todos feliz Páscoa 2018-03-01 00:00:00 2018-03-02 10:26:53
15197aa66ff4d0650b5434f1b46cda19 b18dcdf73be66366873cd26c5724d1dc 1 2018-04-13 00:00:00 2018-04-16 00:39:37

Metadados da tabela de reviews

Número total de linhas: 99.224

Nome_do_Campo Tipo_de_Dado Descrição
review_id character ID da avaliação
order_id character ID do pedido
review_score Integer Pontuação da avaliação
review_comment_title character Título do comentário da avaliação
review_comment_message character Mensagem do comentário da avaliação
review_creation_date character Data de criação da avaliação
review_answer_timestamp character Data e hora da resposta à avaliação

Selecionando Colunas Relevantes

# Selecionar apenas as colunas relevantes: nome da categoria, preço, data limite de envio, e estado do vendedor
olist_order_reviews <- olist_order_reviews %>%
  select(review_score, review_comment_title, review_comment_message)

# Mostrar as primeiras linhas do dataset filtrado
kable(head(olist_order_reviews))
review_score review_comment_title review_comment_message
4
5
5
5 Recebi bem antes do prazo estipulado.
5 Parabéns lojas lannister adorei comprar pela Internet seguro e prático Parabéns a todos feliz Páscoa
1

Metadados da tabela final de reviews

Número total de linhas: 99.224

Nome_do_Campo Tipo_de_Dado Descrição
review_score Integer Pontuação da avaliação
review_comment_title character Título do comentário da avaliação
review_comment_message character Mensagem do comentário da avaliação

Analises

Categorias de Produtos Mais Vendidas

# Criar o dataframe com as categorias mais vendidas
top_10_categoria <- final_df %>%
  group_by(product_category_name) %>%
  summarise(total_pedidos = n()) %>%
  arrange(desc(total_pedidos))%>%
  head(10)

# Criar o gráfico de barras
p <- ggplot(top_10_categoria, aes(x = reorder(product_category_name, total_pedidos), y = total_pedidos)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  coord_flip() + 
  labs(title = "Top 10 Categorias de Produtos Mais Vendidas",
       x = "Categoria de Produto",
       y = "Total de Pedidos") +
  theme_minimal() # Estilo clean para o gráfico



# Tornar o gráfico interativo com plotly, removendo as informações extras

p_interativo <- ggplotly(p, tooltip = c("y")) %>%
  layout(
    width = 700  # Defina a largura desejada

  )

# Exibir o gráfico interativo
p_interativo


1. Identificação das Categorias de Produtos Mais Vendidas: Através da análise de categorias de produtos mais vendidas, conseguimos visualizar quais são os produtos que geram maior volume de pedidos. Isso pode auxiliar a equipe de marketing a direcionar campanhas mais eficazes, focando nas categorias com maior demanda.

Receita Total e Preço Médio por Categoria

# Calcular a receita total e o preço médio por categoria
analise_comb <- final_df %>%
  group_by(product_category_name) %>%
  summarise(
    receita_total = sum(price, na.rm = TRUE),
    preco_medio = mean(price, na.rm = TRUE)
  ) %>%
  arrange(desc(receita_total)) %>%
  slice(1:5)  # Seleciona as top 5 categorias

# Calculando o fator de escala para ajustar o gráfico de linha ao gráfico de barras
scale_factor <- max(analise_comb$receita_total) / max(analise_comb$preco_medio)

# Adicionar coluna transformada para o gráfico de linha
analise_comb <- analise_comb %>%
  mutate(preco_medio_ajustado = preco_medio * scale_factor)

# Criar o gráfico combinado com ggplot2
p <- ggplot(analise_comb, aes(x = reorder(product_category_name, receita_total))) +
  geom_bar(aes(y = receita_total, text = paste("Receita Total: R$", scales::comma(receita_total))),
           stat = "identity", fill = "steelblue", width = 0.6) +
  geom_line(aes(y = preco_medio_ajustado, group = 1, text = paste("Preço Médio: R$", scales::comma(preco_medio, accuracy = 0.01))),
            color = "darkred", size = 1.5) +
  geom_point(aes(y = preco_medio_ajustado, text = paste("Preço Médio: R$", scales::comma(preco_medio, accuracy = 0.01))),
             color = "darkred", size = 3) +
  scale_y_continuous(
    name = "Receita Total (R$)",
    sec.axis = sec_axis(~ . / scale_factor, name = "Preço Médio (R$)")
  ) +
  labs(
    title = "Receita Total e Preço Médio por Categoria de Produto Top 5",
    x = "Categoria de Produto"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(hjust = 0.5, face = "bold")
  )

# Tornar o gráfico interativo usando plotly e ajustar o tooltip
p_interativo <- ggplotly(p, tooltip = c("text")) %>%
  layout(
    width = 700,  # Defina a largura desejada
    height = 500  # Defina a altura desejada
  )

# Exibir o gráfico interativo
p_interativo


2. Receita Total e Preço Médio por Categoria: O gráfico combinado entre receita total e preço médio por categoria de produto oferece insights sobre quais categorias são mais lucrativas e como o preço médio dos produtos pode influenciar essa lucratividade. Isso é crucial para a estratégia de precificação e priorização de inventário.

Total de Pedidos por Mês

# Agrupar os dados por mês e contar o número total de pedidos por mês, somando os anos
pedidos_por_mes <- final_df %>%
  mutate(month = month(shipping_limit_date, label = TRUE)) %>%
  group_by(month) %>%
  summarise(total_pedidos = n()) %>%
  arrange(month)

# Criar o gráfico de barras
p <- ggplot(pedidos_por_mes, aes(x = month, y = total_pedidos)) +
  geom_bar(stat = "identity",fill = "steelblue") +
  geom_text(aes(label = total_pedidos), vjust = -0.5, color = "black", size = 3.5) +
  labs(
    title = "Total de Pedidos por Mês (Todos os Anos)",
    x = "Mês",
    y = "Total de Pedidos"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(hjust = 0.5, face = "bold"),
    legend.position = "none"
  )

# Exibir o gráfico
print(p)


3. Análise Temporal dos Pedidos: Ao analisar a distribuição dos pedidos ao longo dos meses, independentemente do ano, é possível identificar padrões sazonais e picos de vendas. Essas informações são fundamentais para planejamento de estoque e campanhas sazonais.

Distribuição de Pedidos por Estado

# Carregar o shapefile dos estados brasileiros
brasil_estados <- ne_states(country = "Brazil", returnclass = "sf")

# Agrupar os dados por estado e contar o número de pedidos
pedidos_por_estado <- final_df %>%
  group_by(seller_state) %>%
  summarise(total_pedidos = n())

# Unir o shapefile dos estados com os dados dos pedidos
brasil_estados <- brasil_estados %>%
  left_join(pedidos_por_estado, by = c("postal" = "seller_state"))

# Mapa de calor com ggplot2
p <- ggplot(data = brasil_estados) +
  geom_sf(aes(fill = total_pedidos), color = "white") +
  scale_fill_viridis_c(option = "plasma", na.value = "grey90") +
  labs(
    title = "Distribuição de Pedidos por Estado",
    fill = "Total de Pedidos                      /"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold")
  )

# Converter para um gráfico interativo
p_interativo <- ggplotly(p)

# Exibir o gráfico interativo
p_interativo


4. Distribuição Geográfica dos Pedidos: A distribuição de pedidos por estado, visualizada em um mapa de calor, revela quais regiões têm maior concentração de vendas. Essas informações podem ser utilizadas para otimizar a logística de distribuição, além de identificar oportunidades para expansão em mercados menos explorados.

Reviews

# Contar quantas reviews existem para cada score e quantas delas possuem comentário (em uma das colunas de título ou mensagem)
result <- olist_order_reviews %>%
  group_by(review_score) %>%
  summarise(
    total_reviews = n(),  # Total de reviews para cada score
    reviews_com_comentarios = sum(
      !is.na(review_comment_title) & review_comment_title != "" |
      !is.na(review_comment_message) & review_comment_message != ""
    )  # Contar reviews com algum comentário (título ou mensagem)
  )


# Criar o gráfico de barras
p <- ggplot(result, aes(x = factor(review_score))) +
  geom_bar(aes(y = total_reviews, fill = "Total de Reviews"), stat = "identity", position = "dodge", color = "black") +
  geom_bar(aes(y = reviews_com_comentarios, fill = "Reviews com Comentários       "), stat = "identity", position = "dodge", color = "black") +
  labs(title = "Distribuição de Reviews e Comentários por Score",
       x = "Score de Review",
       y = "Número de Reviews",
       fill = "Legenda") +
  scale_fill_manual(values = c("Total de Reviews" = "steelblue", "Reviews com Comentários       " = "darkorange")) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),  # Rotacionar os rótulos do eixo X
    plot.margin = margin(20, 10, 10, 10, "pt"),         # Ajustar margens para evitar corte
    legend.position = "top",                            # Mover a legenda para o topo
    legend.text = element_text(size = 10),              # Tamanho do texto da legenda
    legend.title = element_text(size = 12)              # Tamanho do título da legenda
  )

# Converter para um gráfico interativo
p_interativo <- ggplotly(p, tooltip = c("y"))

# Exibir o gráfico interativo
p_interativo


5. Análise das Reviews e Comentários: Esta análise explora a distribuição de reviews por pontuação (score) e a proporção de reviews que contém comentários textuais. Compreender o relacionamento entre a pontuação e a presença de feedback escrito é essencial para identificar oportunidades de melhoria e estratégias de comunicação com os clientes. O gráfico mostra que reviews com pontuações extremas (1 e 5) tendem a ter mais comentários, enquanto notas intermediárias podem indicar clientes que não tiveram experiências marcantes.

Principais Padrões de Palavras em Reviews

# Filtrar os comentários positivos e negativos, removendo NAs, strings vazias e eliminando espaços em branco extras
comentarios_positivos <- olist_order_reviews %>%
  filter(review_score %in% c(4, 5)) %>%
  filter(!is.na(review_comment_message), str_trim(review_comment_message) != "") %>%  # Remover NAs e strings vazias
  mutate(review_comment_message = str_squish(review_comment_message)) %>%  # Remover espaços em branco extras
  select(review_comment_message) %>%
  unnest_tokens(trigram, review_comment_message, token = "ngrams", n = 3)

# Filtrar os comentários positivos e negativos, removendo NAs, strings vazias e eliminando espaços em branco extras
comentarios_positivos <- olist_order_reviews %>%
  filter(review_score %in% c(4, 5)) %>%
  filter(!is.na(review_comment_message), str_trim(review_comment_message) != "") %>%  # Remover NAs e strings vazias
  mutate(review_comment_message = str_squish(review_comment_message)) %>%  # Remover espaços em branco extras
  select(review_comment_message) %>%
  unnest_tokens(trigram, review_comment_message, token = "ngrams", n = 3) %>%
  filter(trigram != "NA")  # Remover trigramas com NA

comentarios_negativos <- olist_order_reviews %>%
  filter(review_score %in% c(1, 2)) %>%
  filter(!is.na(review_comment_message), str_trim(review_comment_message) != "") %>%  # Remover NAs e strings vazias
  mutate(review_comment_message = str_squish(review_comment_message)) %>%  # Remover espaços em branco extras
  select(review_comment_message) %>%
  unnest_tokens(trigram, review_comment_message, token = "ngrams", n = 3) %>%
  filter(trigram != "NA")  # Remover trigramas com NA

# Contar os trigramas mais frequentes nos comentários positivos e negativos
trigramas_positivos <- comentarios_positivos %>%
  count(trigram, sort = TRUE) %>%
  top_n(10)

trigramas_negativos <- comentarios_negativos %>%
  count(trigram, sort = TRUE) %>%
  top_n(10)

# Gráfico para trigramas positivos
grafico_positivos <- ggplot(trigramas_positivos, aes(x = reorder(trigram, n), y = n)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  coord_flip() +
  labs(title = "Principais Comentários Positivos",
       x = NULL, y = "Frequência") +
  theme_minimal()

# Gráfico para trigramas negativos
grafico_negativos <- ggplot(trigramas_negativos, aes(x = reorder(trigram, n), y = n)) +
  geom_bar(stat = "identity", fill = "brown") +
  coord_flip() +
  labs(title = "Principais Comentários Negativos",
       x = NULL, y = "Frequência") +
  theme_minimal()

# Mostrar os gráficos lado a lado
grid.arrange(grafico_positivos, grafico_negativos, ncol = 2)


6. Análise de Trigramas em Comentários Positivos e Negativos: A análise de trigramas oferece uma visão mais detalhada sobre os temas recorrentes nas avaliações dos clientes, permitindo identificar padrões de feedback nos comentários positivos e negativos. Isso pode ajudar a entender os principais fatores que levam à satisfação ou insatisfação dos clientes. As palavras mais frequentes nos comentários positivos e negativos revelam áreas que devem ser destacadas nas campanhas de marketing ou ajustadas para melhorar a experiência do cliente.


Conclusão

A partir da análise dos dados da Olist Store, foram extraídas informações cruciais que podem orientar decisões estratégicas para otimizar o desempenho da loja. Compreender os padrões de venda e comportamento dos clientes ao longo de diferentes categorias de produtos, regiões geográficas e períodos temporais oferece uma base sólida para melhorar a eficiência operacional e aumentar a lucratividade.

Identificar as categorias de produtos mais populares e avaliar suas margens de lucro permite ajustar o foco da empresa em áreas com maior potencial de crescimento e rentabilidade. Além disso, entender a sazonalidade e as flutuações na demanda possibilita uma melhor previsão de vendas e o planejamento adequado de estoques, evitando desperdícios ou falta de produtos durante os períodos de pico.

A análise geográfica dos pedidos, por sua vez, permite o aprimoramento das estratégias de distribuição e logística, focando em regiões onde há maior demanda ou buscando oportunidades em mercados menos explorados.

Essas percepções juntas podem guiar ações para aumentar a eficiência, expandir para novos mercados e otimizar a oferta de produtos, promovendo um crescimento sustentável para a Olist Store.